home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9401_2.lha / Amiga0194b / Blitz-Basic / listing2.asc < prev    next >
Text File  |  1994-02-28  |  4KB  |  148 lines

  1. ;
  2. ; IsoBlaster V0.1 by Simon Armstrong
  3. ;
  4.  
  5. ;
  6. ; Typdefinitionen und Felder
  7. ;
  8.  
  9. NEWTYPE .object ;wie IsoRender.bb plus extra Felder
  10.   depth.q:id    ;Tiefe und Shape, wobei ID 0=me 1=mozzy
  11.   x:y:z         ;3D Koordinaten der Shape
  12.   vx:vy         ;Geschwindigkeit in x and y-Richtung
  13.   rot:rot2:rotv ;Variablen fuer die Rotation
  14.   sx:sy         ;Screenposition nach der Iso-Projection
  15. End NEWTYPE
  16.  
  17. Dim List bob.object(50)
  18.  
  19. DEFTYPE .object *me
  20.  
  21. Dim qsin(255),qcos(255) ;Feld mit Werten fuer sin/cos belegen sodass sie nicht
  22. For r=0 To 255          ;waehrend des Spiels berechnet werden muessen
  23.   qsin(r)=Sin(Pi*r/128):qcos(r)=Cos(Pi*r/128)
  24. Next
  25.  
  26. Dim map.w(20,20) ;bisschen kleiner als Verlies (z.Zt.)
  27.  
  28. ;
  29. ; Alle Graphiken von der Platte laden
  30. ;
  31.  
  32. LoadShapes 0,"blocks.shapes"  ;Fliesen fuer Boden
  33. LoadShapes 4,"balls.shapes"   ;Kugeln fuer fx etc.
  34. LoadPalette 0,"balls.iff"     ;Palette fuer Vordergrund Playfield
  35. LoadPalette 0,"blocks.iff",8  ;Palette fuer Hintergrund
  36. LoadShapes 16,"isoshapes"     ;Shapes, von IsoRender.bb berechnet
  37.  
  38. BitMap 0,320+64,256+80,3  ;Vordergrund A
  39. BitMap 1,320+64,256+80,3  ;Vordergrund B
  40. BitMap 2,640,512,3        ;Grosser Hintergrund zum Scrollen
  41.  
  42. Queue 0,32:Queue 1,32   ;2 Queues fuer doppelt gepuffertes Blitting
  43.  
  44. Macro p 320+(`1-`2)ASL 4,128+(`1+`2-`3)ASL3:End Macro     ;hinten
  45. Macro f 320+32-sx+(`1-`2)ASL4,128+32-sy+(`1+`2-`3)ASL3:End Macro  ;vorne
  46.  
  47. ;
  48. ; Blitz Mode Display erzeugen, hier Dualplayfield mit 
  49. ; doppelt gepuffertem Vordergrund!
  50. ;
  51.  
  52. BLITZ
  53. Slice 0,44,320,256,$fffa,6,8,32,320+64,640
  54. Use Palette 0
  55.  
  56. Gosub setupmap  ;2D-Feld mit einigen Bloecken belegen
  57. Gosub drawmap ;Karte in den Hintergrund zeichnen
  58. Gosub initgame  ;Objekte initialisieren
  59.  
  60. ; nun endlich die Arbeitsschleife, wie bei jedem Spiel
  61.  
  62. While Joyb(0)=0
  63.   VWait:ShowF db,32,40,sx:ShowB 2,sx,sy,32  ;Bitmaps im Display positionieren
  64.   db=1-db:Use BitMap db   ;Bitmap tauschen fuer doppelte Pufferung
  65.   Gosub moveme              ;mich bewegen
  66.   Gosub movethem            ;und die anderen auch
  67.   UnQueue db:Gosub drawbobs ;Objekte in neue Position zeichnen
  68. ; MOVE#-1,$dff180 ;Frameaufbau beachten!
  69. Wend
  70.  
  71. End
  72.  
  73. ;
  74. ; und dies hier bringt alles richtig zum Laufen
  75. ;
  76.  
  77. .moveme:
  78.   USEPATH *me                   ;Zeiger auf Listenobjekt
  79.   \rot=QWrap(\rot-Joyx(1)/2,0,16) ;je nach Joystick drehen
  80.   If Joyb(1)=1                    ;bei Feuer
  81.     \vx+qsin(\rot ASL 4) ASR 6    ;Schub in die Richtung,
  82.     \vy+qcos(\rot ASL 4) ASR 6    ;in die ich zeige (my \rot)
  83.   EndIf
  84.   \vx-\vx ASR 5         ;einen Teil des Betrags der
  85.   \vy-\vy ASR 5         ;Geschwindigkeit abziehen und
  86.   \x=QLimit(\x+\vx,0,19) ;Geschwindigkeit zu der Position addieren
  87.   \y=QLimit(\y+\vy,0,19)
  88.   \sx=!p{\x,\y,\z}        ;Bildschirmkoordinaten berechnen
  89.   sx=QLimit(\sx-160,0,320) ;Werte zum Scrollen berechnen sodass
  90.   sy=QLimit(\sy-128,0,256) ;ich moeglichst in die Mitte des Displays komme
  91.   \sx-sx+32:\sy-sy+32
  92.   \depth=\x+\y            ;die Tiefe nicht vergessen
  93.   If map(\x,\y)=1         ;und den Block einfaerben wenn ich auf einem bin
  94.     Use BitMap 2:x=Int(\x):y=Int(\y):Blit 2,!p{x,y,0}:Use BitMap db
  95.   EndIf
  96.   Return
  97.  
  98. .movethem:
  99.   USEPATH bob()         ;einfache Schleife, die alle Shapes
  100.   ResetList bob()       ;mit \id=2 in Kreisen
  101.   While NextItem(bob()) ;herumfliegen laesst...
  102.  
  103.     If \id=2
  104.       \rot=QWrap(\rot+\rotv,0,16)
  105.       \rot2=QWrap(\rot2+1,0,16)
  106.       \x+qsin(\rot ASL 4) ASR 4:\y+qcos(\rot ASL 4) ASR 4
  107.       \sx=!f{\x,\y,\z}
  108.       \depth=\x+\y
  109.     EndIf
  110.   Wend
  111.  
  112. .drawbobs:
  113.   SortList bob()          ;rueckwaerts sortieren
  114.   ResetList bob()       ;Schleife ueber alle Shapes: zeichnen und wenn
  115.   USEPATH bob()         ;\id=2 auch den Propeller zeichnen
  116.   While NextItem(bob())
  117.     If RectsHit(\sx,\sy,1,1,16,40,320+31,256+40)
  118.       QBlit db,\id*16+\rot,\sx,\sy
  119.       If \id=2 Then QBlit db,\id*16+16+\rot2,\sx,\sy
  120.     EndIf
  121.   Wend
  122.   Return
  123.  
  124. .initgame:
  125.   ClearList bob()
  126.   AddItem bob():*me.object=bob()
  127.   *me\id=1,.5,.5,0
  128.   For i=0 To 2
  129.     If AddItem(bob())
  130.       bob()\id=2,Rnd(19),Rnd(19):\rotv=(Rnd(1)-.5)ASR 2
  131.     EndIf
  132.   Next
  133.   Return
  134.  
  135. .setupmap:
  136.   For x=0 To 19:For y=0 To 19:map(x,y)=1:Next:Next
  137.   For x=9 To 11:For y=9 To 11:map(x,y)=-1:Next:Next
  138.   Return
  139.  
  140. .drawmap:
  141.   Use BitMap 2
  142.   For x=0 To 19
  143.     For y=0 To 19
  144.       If map(x,y)>-1 Then Blit map(x,y),!p{x,y,0}
  145.     Next
  146.   Next
  147.   Return
  148.